<?php
/**
 * コントローラー基底クラス
 *
 * @package Controller
 * @subpackage Abstract
 */
abstract class Controller_Action extends Zend_Controller_Action
{
	/**
	 * @var array
	 */
	protected static $_errorMessages = array();

	/**
	 * @var array
	 */
	protected static $_stdMessages = array();

	/**
	 * レンダリング処理を行いません。
	 *
	 * @return Zend_Controller_Action_Helper_ViewRenderer
	 */
	public function _setViewNeverRender()
	{
		Controller_Plugin_DebugAbstract::changeEnable(false);
		$this->_helper->layout->disableLayout();
		return $this->_helper->viewRenderer->setNeverRender();
	}

	/**
	 * 描画するViewテンプレートファイルを明示的に指定します。
	 *
	 * @param string $tplFileName
	 * @param string optional $tplFilePath
	 * @return Zend_Controller_Action_Helper_ViewRenderer
	 */
	protected function _setViewRenderFile($tplFileName, $tplFilePath = ':controller/')
	{
		return $this->_helper->viewRenderer->setViewScriptPathSpec($tplFilePath . $tplFileName . '.:suffix');
	}

	/**
	 * レイアウトファイルを明示的に指定します。
	 *
	 * @param string $layoutFileName
	 * @return Zend_Layout
	 */
	protected function _setViewLayoutFile($layoutFileName)
	{
		if ($this->_helper->layout()->isEnabled()) {
			$this->_helper->layout->setLayout($layoutFileName);
		}
		return $this->_helper->layout;
	}

	/**
	 * 403エラーを出力します。
	 *
	 * @throws UserException
	 */
	protected function _throw403Error($innserMessage = '', $showMessage = '')
	{
		throw new UserException($innserMessage, 403, $showMessage);
	}

	/**
	 * 404エラーを出力します。
	 *
	 * @throws UserException
	 */
	protected function _throw404Error($innserMessage = '', $showMessage = '')
	{
		throw new UserException($innserMessage, 404, $showMessage);
	}

	/**
	 * 400エラーを出力します。
	 *
	 * @throws UserException
	 */
	protected function _throw400Error($innserMessage = '', $showMessage = '')
	{
		throw new UserException($innserMessage, 400, $showMessage);
	}

	/**
	 * 通常系メッセンジャーを返します。
	 *
	 * @return Controller_Action_Helper_StdMessenger
	 */
	protected function _getStdMessenger()
	{
		return $this->_helper->StdMessenger;
	}

	/**
	 * エラー系メッセンジャーを返します。
	 *
	 * @return Zend_Controller_Action_Helper_FlashMessenger
	 */
	protected function _getErrorMessenger()
	{
		return $this->_helper->FlashMessenger;
	}

	/**
	 * エラーメッセージを追加
	 *
	 * @param string|array $message
	 * @return void
	 */
	protected function _addErrorMessage($message)
	{
		if (is_array($message)) {
			foreach ($message as $msg) {
				$this->_addErrorMessage($msg);
			}
		}
		elseif (strlen($message) && !in_array($message, self::$_errorMessages)) {
			self::$_errorMessages[] = $message;
		}
	}

	/**
	 * 通常メッセージを追加
	 *
	 * @param string|array $message
	 * @return void
	 */
	protected function _addStdMessage($message)
	{
		if (is_array($message)) {
			foreach ($message as $msg) {
				$this->_addStdMessage($msg);
			}
		}
		elseif (strlen($message) && !in_array($message, self::$_stdMessages)) {
			self::$_stdMessages[] = $message;
		}
	}

	/**
	 * (non-PHPdoc)
	 * @see Zend_Controller_Action::postDispatch()
	 */
	public function postDispatch()
	{
		parent::postDispatch();

		if ($this->_getErrorMessenger()->hasMessages()) {
			$this->_addErrorMessage($this->_getErrorMessenger()->getMessages());
		}
		$this->view->ErrorMessages = self::$_errorMessages;

		if ($this->_getStdMessenger()->hasMessages()) {
			$this->_addStdMessage($this->_getStdMessenger()->getMessages());
		}

		$this->view->StdMessages = self::$_stdMessages;
		
		// 設定から変数assgin
		$config = App::getInstance()->getConfig()->assign->toArray();
		
		$this->view->config = isset($config['tpl']) ? $config['tpl'] : array();
		$this->view->__javascript = isset($config['javascript']) ? $config['javascript'] : array();
	}
}
